Previous: Setting Generalized Variables, Up: Generalized Variables [Contents][Index]
setf
formsThis section describes how to define new forms that
setf can operate on.
This macro enables you to easily define setf
methods for simple cases. name is the name of a
function, macro, or special form. You can use this macro
whenever name has a directly corresponding
setter function that updates it, e.g.,
(gv-define-simple-setter car setcar).
This macro translates a call of the form
(setf (name args…) value)
into
(setter args… value)
Such a setf call is documented to return
value. This is no problem with, e.g.,
car and setcar, because
setcar returns the value that it set. If your
setter function does not return value,
use a non-nil value for the
fix-return argument of
gv-define-simple-setter. This expands into
something equivalent to
(let ((temp value)) (setter args… temp) temp)
so ensuring that it returns the correct result.
This macro allows for more complex setf
expansions than the previous form. You may need to use this
form, for example, if there is no simple setter function to
call, or if there is one but it requires different arguments
to the place form.
This macro expands the form (setf (name
args…) value) by first
binding the setf argument forms
(value args…)
according to arglist, and then executing
body. body should return a Lisp form
that does the assignment, and finally returns the value that
was set. An example of using this macro is:
(gv-define-setter caar (val x) `(setcar (car ,x) ,val))
For more control over the expansion, see the macro
gv-define-expander. The macro
gv-letplace can be useful in defining macros that
perform similarly to setf; for example, the
incf macro of Common Lisp. Consult the source file
gv.el for more details.
Common Lisp note: Common Lisp defines another way to specify the
setfbehavior of a function, namelysetffunctions, whose names are lists(setf name)rather than symbols. For example,(defun (setf foo) …)defines the function that is used whensetfis applied tofoo. Emacs does not support this. It is a compile-time error to usesetfon a form that has not already had an appropriate expansion defined. In Common Lisp, this is not an error since the function(setf func)might be defined later.
Previous: Setting Generalized Variables, Up: Generalized Variables [Contents][Index]